﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace helicopterFight
{
    public class StateManager
    {
        private List<State> stany = new List<State>();
        private Dictionary<String, bool> stanyInited = new Dictionary<String, bool>();
        private Console konsola = Game1.konsola;
        private State aktualnyStan = null;
        private Game1 gam = null;

        public bool connected = false;

        public StateManager(Game1 g)
        {
            gam = g;
        }

        public void dodajStan(State stan)
        {
            if (stany.Contains(stan))
            {
                konsola.addMessage("SM->dodajStan: Stan już istnieje! " + stan.getNazwa());
            }
            else
            {
                if (stany.Count == 0)
                    aktualnyStan = stan;
                stany.Add(stan);
                stan.setContent(gam);
                stanyInited[stan.getNazwa()] = false;
            }
        }

        public void usunStan(State stan)
        {
            if (!stany.Contains(stan))
            {
                konsola.addMessage("SM->usunStan: Nie ma takiego stanu! " + stan.getNazwa());
            }
            else
            {
                stany.Remove(stan);
                stanyInited.Remove(stan.getNazwa());
            }
        }

        public void usunStan(String nazwa)
        {
            foreach (State st in stany)
            {
                if (st.getNazwa().Equals(nazwa))
                {
                    if(aktualnyStan.Equals(st))
                        konsola.addMessage("SM->usunStan: Usuwam aktualny stan!" + nazwa);
                    stany.Remove(st);
                    stanyInited.Remove(nazwa);
                    return;
                }
            }

            konsola.addMessage("SM->usunStan: Nie ma takiego stanu! " + nazwa);
        }

        public void zmienStan(String nazwa)
        {
            foreach (State st in stany)
            {
                if (st.getNazwa().Equals(nazwa))
                {
                    aktualnyStan = st;
                    if (stanyInited[nazwa] == false)
                        aktualnyStan.initialize();
                    stanyInited[nazwa] = true;
                    return;
                }
            }

            konsola.addMessage("SM->zmienStan: Nie ma takiego stanu! " + nazwa);
        }

        public State pobierzStan(String nazwa)
        {
            foreach (State st in stany)
            {
                if (st.getNazwa().Equals(nazwa))
                {
                    return st;
                }
            }

            konsola.addMessage("SM->pobierzStan: Nie ma takiego stanu! " + nazwa);
            return null;
        }

        public void zmienStan(State st)
        {
            if (stany.Contains(st))
            {
                aktualnyStan = st;
                if (stanyInited[aktualnyStan.getNazwa()] == false)
                    aktualnyStan.initialize();
                stanyInited[st.getNazwa()] = true;
            }
            else
            {
                konsola.addMessage("SM->zmienStan: Nie ma takiego stanu! " + st.getNazwa());
            }
        }

        public void rysuj(GameTime gameTime)
        {
            aktualnyStan.draw(gameTime);
        }

        public void aktualizuj()
        {
            aktualnyStan.update();
        }

        public void wczytajDane()
        {
            foreach (State st in stany)
            {
                st.loadContent();
            }
        }

    }
}
